/**
 * memca.h
 * 单条独立内存预分配接口/类型声明及实现
 * 
 * 竹影半墙
 * 2023.08
 */
#ifndef MEMCA_H
#define MEMCA_H

#include "base.h"

#define ma_max(a, b) ((a) > (b) ? (a) : (b))

/**
 * 内存预分配
 * @size 预分配大小
 * @max  预分配个数
 * @num  当前预分配剩余
 * head  预分配内存头
 */
struct memca {
    uint16_t size;
    uint32_t max;
    uint32_t num;
    void *head;
};

void mca_init (struct memca *ma);
void mca_close(struct memca *ma);

void * mca_alloc(struct memca *ma);
void   mca_free (struct memca *ma, void *v);

static inline 
void * ma_alloc(struct memca *m, void **h, uint32_t dec)
{
    void *v;

    if ((v=*h)) {
        *h = *(void **)v;
        m->num -= dec;
    }
    return v;
}

static inline 
void ma_free(struct memca *m, void **h, void *v, int nochk)
{
    if (nochk || m->num < m->max) {
        *(void **)v = *h;
        m->num += !nochk;
        *h = v;
        return ;
    }
    free(v);
    return ;
}
#endif